﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Data.AID;
using Microsoft.SharePoint;
using Business.AID.Extensions;

namespace Business.AID
{
    public class FormularioBO
    {

        /// <summary>
        /// Recupera todos os formulários.
        /// </summary>
        /// <returns></returns>
        public List<Formulario> GetAllForms()
        {
            FormularioDAO formularioDAO = new FormularioDAO();
            return formularioDAO.GetAllForms();
        }
        
        /// <summary>
        /// Recupera um formulário por colaborador.
        /// </summary>
        /// <param name="Employee">Colaborador</param>
        /// <returns></returns>
        public Formulario GetFormByEmployee(Colaborador Employee)
        {
            FormularioDAO formularioDAO = new FormularioDAO();
            return formularioDAO.GetFormByEmployee(Employee);
        }

        public List<Formulario> GetFormsByEmployee(Colaborador Employee)
        {
            return new FormularioDAO().GetFormsByEmployee(Employee);
        }

        public List<Formulario> GetAllFormsByYear()
        {
            FormularioDAO formularioDAO = new FormularioDAO();
            return formularioDAO.GetAllFormsByYear();
        }

        public List<Formulario> GetFormsByStage(int idStage) 
        {
            return new FormularioDAO().GetFormsByStage(idStage);
        }

        /// <summary>
        /// Recupera um formulário pelo Id do Colaborador.
        /// </summary>
        /// <param name="Id">Id do Colaborador</param>
        /// <returns></returns>
        public Formulario GetFormById(int Id)
        {
            FormularioDAO formularioDAO = new FormularioDAO();
            return formularioDAO.GetFormById(Id);
        }
        
        /// <summary>
        /// Cria um novo formulário.
        /// </summary>
        /// <param name="Collaborator">Colaborador ao qual pertencerá o formulário.</param>
        public void CreateForm(Formulario form)
        {
            FormularioDAO formularioDAO = new FormularioDAO();
            formularioDAO.CreateForm(form);
        }
        
        /// <summary>
        /// Define o estágio do formulário.
        /// </summary>
        /// <param name="idForm">Id do Formulário</param>
        /// <param name="idStage">Próximo estágio do formulário.</param>
        public void SetFormStage(int idFormulario, int IdStage)
        {
            FormularioDAO formularioDAO = new FormularioDAO();
            formularioDAO.SetFormStage(idFormulario, IdStage);
        }
       
        /// <summary>
        /// Recupera todos os formulários de um gestor.
        /// </summary>
        /// <param name="idManager">Id do Gestor.</param>
        /// <returns></returns>
        public List<Formulario> GetSubordinateForms(int IdStage)
        {
            FormularioDAO formularioDAO = new FormularioDAO();
            return formularioDAO.GetSubordinateForms(IdStage);
        }
        
        /// <summary>
        /// Define se o formulário foi aprovacão ou devolvido por um gestor.
        /// </summary>
        /// <param name="form">Formulário a ser atualizado.</param>
        public void SetManagerApproval(Formulario form)
        {
            FormularioDAO formularioDAO = new FormularioDAO();
            formularioDAO.SetManagerApproval(form);
        }
        
        /// <summary>
        /// Define se o formulário foi aprovacão ou devolvido pela auditoria.
        /// </summary>
        /// <param name="form">Formulário a ser atualizado.</param>
        public void SetAuditApproval(Formulario form)
        {
            FormularioDAO formularioDAO = new FormularioDAO();
            formularioDAO.SetAuditApproval(form);
        }
        
        /// <summary>
        /// Recupera todos os formulários que estão no estágio da auditoria.
        /// </summary>
        /// <returns></returns>
        public List<Formulario> GetAuditForms()
        {
            FormularioDAO formularioDAO = new FormularioDAO();
            return formularioDAO.GetAuditForms();
        }

        /// <summary>
        /// Valida se todas as metas do formulário que está sendo enviado estão corretamente preenchidas.
        /// </summary>
        /// <param name="idForm">Id do Formulário que está sendo enviado.</param>
        /// <returns></returns>
        public Boolean isPopulated(int idForm)
        {
            MetaBO metaBO = new MetaBO();

            List<Meta> meta = metaBO.GetAllGoalsByForm(idForm);

            if (!metaBO.isPopulated(meta))
            {
                Alert.Show("Verifique se todas as metas estão preenchidas corretamente.");
                return false;
            }
            else
            {
                return true;
            }
        }

        /// <summary>
        /// Verifica se alguma meta está com status de devolução.
        /// </summary>
        /// <param name="ListaMeta">Lista de metas</param>
        /// <returns></returns>
        public Boolean isValidFormGestor(List<Meta> ListaMeta)
        {
            foreach (Meta meta in ListaMeta)
            {
                if (meta.Rejeicao == true)
                {
                    return false;
                }
            }
            return true;
        }

        public Boolean isAlreadyApproved(int idForm, int idCurrentEstagio)
        {
            FormularioDAO formularioDAO = new FormularioDAO();
            Formulario formulario = formularioDAO.GetFormById(idForm);

            if (formulario != null)
            {
                if (formulario.Estagio != idCurrentEstagio)
                {
                    //Retorna True se o formulário já está aprovado.
                    return true;
                }
                else
                {
                    //Retorna False se o formulário ainda não foi aprovado.
                    return false;
                }
            }
            else
            {
                return true;
            }
        }

        /// <summary>
        /// Insere um anexo na lista.
        /// </summary>
        /// <param name="idItem">Id do item a anexar o item.</param>
        /// <param name="fileName">Nome do arquivo.</param>
        /// <param name="contents">Conteudo do fileUpload.</param>
        public void InsertAttachment(int idItem, string fileName, byte[] contents)
        {
            FormularioDAO formularioDAO = new FormularioDAO();
            formularioDAO.InsertAttachment(idItem, fileName, contents);
        }

        /// <summary>
        /// Deleta um anexo da lista.
        /// </summary>
        /// <param name="idItem">Id do item onde se encontra o anexo a ser deletado.</param>
        public void DeleteAttachment(int idItem)
        {
            FormularioDAO formularioDAO = new FormularioDAO();
            formularioDAO.DeleteAttachment(idItem);
        }
    }
}
